package CutLoad.mc
{
	import CutLoad.Base;
	import CutLoad.components.CTextField;
	
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	/**
	 * 把 MovieClip元件包装成一个按钮，按钮的四个状态对应着:MovieClip实例时间轴的第1,第2,第3,第4关键帧来显示.
	 * <p>注：该类可以包装两种形式的 MovieClip元件做为按钮:一种是已经加到显示对象里，一种是没有加到显示对象里，这种的话这个元件包括在McToBtn里。当你操作目标对象时，比如添加一个事件，如果是前
	 * 情况就要使用McToBtn.getTarget()获得真正的目标来进行操作.</p>
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */
	public class McToBtn extends Base
	{
		private var mcTarget:MovieClip;
		private var isDown:Boolean=false;
		private var txt:CTextField;
		//
		private var isSetStatesWhenFrame1UnLock:Boolean;
		//
		//包装的电影实例是否已被放到可视对像里了。
		private var isInMe:Boolean=false;
		//标签的两种状态
		private var obj1:Object=new Object(),obj2:Object=new Object();
		//微调标签的位置
		private var offsetLabelX:Number=0,offsetLabelY:Number=0;
		//是否可用
		private var enabled:Boolean=true;
		/**
		 * 从库中取得一个MovieClip元件，并把它转换成按钮
		 * @param linkName MovieClip元件连接名称
		 * @param lable 按钮标签名
		 * @return 
		 * 
		 */		
		public static function getFromLib(linkName:String,lable:String=""):McToBtn{
			var mc:MovieClip=Base.getStrClassObject(linkName) as MovieClip;
			return new McToBtn(mc,lable);
		}
		/**
		 * 包装并返回电影实例内部子电影实例的McToBtn,注:使用这个方法情况，是当要包装的电影实例是Object类型时，可以简化一些代码，省去类型强制转换。
		 * @param mcObj Object类型的电影实例
		 * @param mcChildrenName mcObj的子类电影实例名称
		 * @return 
		 * 
		 */		
		public static function getFromParentMcObj(mcObj:Object,mcChildrenName:String):McToBtn{
			return new McToBtn(mcObj[mcChildrenName] as MovieClip);
		}
		/**
		 * 包装并返回电影实例的McToBtn,注:使用这个方法情况，是当要包装的电影实例是Object类型时，可以简化一些代码，省去类型强制转换。
		 * @param mcObj Object类型的电影实例
		 * @return 
		 * 
		 */		
		public static function getFromMcObj(mcObj:Object):McToBtn{
			return new McToBtn(mcObj as MovieClip)
		}
		/**
		 * 包装的电影实例是否已被放到可视对像（初始化时new McToBtn(target:MovieClip...) target.parent是否为空）里了.
		 * @return  true 已在别的可视对象里，false没有
		 * 
		 */		
		public function isTargetInMe():Boolean{
			return this.isInMe;
		}
		/**
		 * 返回被包装的电影实例
		 * @return 
		 * 
		 */		
		public function getTarget():MovieClip{
			return this.mcTarget;
		}
		/**
		 * 
		 * @param target 要转换成按钮的MovieClip
		 * @param lable 标签
		 * @param isButtonMode 是否显示手形
		 * @param isClickGotoStateOver 是否点击后，保持鼠标放上去时的状态
		 * 
		 */		
		public function McToBtn(target:MovieClip,lable:String="",isButtonMode:Boolean=true)
		{
			//if(target.totalFrames!=4) throw new Error("要转换成按钮的MovieClip,必须含用4个帧");
			this.mcTarget=target;
			if(mcTarget.parent==null){
				isInMe=true
				this.mouseChildren=false;
				this.buttonMode=isButtonMode
				this.addChild(mcTarget);
				this.mouseChildren=false;
				this.addEventListener(MouseEvent.MOUSE_DOWN,funMouse);
				this.addEventListener(MouseEvent.MOUSE_OVER,funMouse);
				this.addEventListener(MouseEvent.MOUSE_OUT,funMouse);
				this.addEventListener(MouseEvent.MOUSE_UP,funMouse);
			}else{
				isInMe=false;
				mcTarget.mouseChildren=false;
				mcTarget.buttonMode=isButtonMode
				mcTarget.addEventListener(MouseEvent.MOUSE_DOWN,funMouse);
				mcTarget.addEventListener(MouseEvent.MOUSE_OVER,funMouse);
				mcTarget.addEventListener(MouseEvent.MOUSE_OUT,funMouse);
				mcTarget.addEventListener(MouseEvent.MOUSE_UP,funMouse);
			}
			
			//
			obj1.color=0x000000;
			obj1.size=13;
			obj2.color=0x000000;
			obj2.size=13;
			//
			txt=new CTextField();
			txt.init(lable,CTextField.getTextFormat(0,obj1.color,obj1.size));
			//txt.showBodor();
			txt.show(mcTarget);
			updateTxtPosition();
			//
			setStates(1);
			isSetStatesWhenFrame1UnLock=true;
		}
		private function updateTxtPosition():void{
			var hh:Number=txt.getTxtHeight();
			var ww:Number=txt.getTxtWidth();
			var xx:Number=Math.abs(this.width-ww)/2+offsetLabelX;
			var yy:Number=Math.abs(this.height-hh)/2+offsetLabelY;
			txt.setXY(xx,yy);
		}
		/**
		 * 微调按钮标签的位置，这个微调参数是用在标签自动设置中心点坐标后与它相加
		 * @param xx
		 * @param yy
		 * 
		 */		
		public function offsetLabelPosition(xx:Number,yy:Number):void{
			offsetLabelX=xx;
			offsetLabelY=yy;
			updateTxtPosition()
		}
		/**
		 * 获得标签
		 * @return 
		 * 
		 */		
		public function get label():String{
			return txt.text;
		}
		/**
		 * 设置标签
		 * @param str
		 * 
		 */		
		public function set label(str:String):void{
			txt.text=str;
			updateTxtPosition()
		}
		/**
		 * 设置标签的字色和大小，可以设置两种状态：鼠标放上面和没有放上面的状态。 
		 * @param s1Color 鼠标没有放上面字色
		 * @param s1Szie 鼠标没有放上面字大小
		 * @param s2Color 鼠标有放上面字色
		 * @param s2Szie 鼠标没放上面字大小
		 * 
		 */		
		public function setLabel2States(s1Color:Number,s1Szie:Number,s2Color:Number=-1,s2Szie:Number=-1):void{
			obj1.color=s1Color;
			obj1.size=s1Szie;
			if(s2Color==-1||s2Szie==-1){
				obj2.color=s1Color;
				obj2.size=s1Szie;
			}else{
				obj2.color=s2Color;
				obj2.size=s2Szie;
			}
			setTxtFormat();
		}
		private function setTxtFormat(a:Number=1):void{
			if(a==1){
				txt.setTextFormat(CTextField.getTextFormat(0,obj1.color,obj1.size));
			}else{
				txt.setTextFormat(CTextField.getTextFormat(0,obj2.color,obj2.size));
			}
			
			updateTxtPosition()
		}
		/**
		 * 获得按钮标签所用的 CTextField实例
		 * @return 
		 * 
		 */		
		public function get LabelTxt():CTextField{
			return txt;
		}
		private function funMouse(e:MouseEvent):void{
			if(!enabled) return;
			switch(e.type){
				case MouseEvent.MOUSE_DOWN:
					isDown=true;
					mcTarget.gotoAndStop(3);
					setTxtFormat()
					//trace("down")
					break;
			}
			switch(e.type){
				case MouseEvent.MOUSE_OVER:
					//trace("over")
					if(!isDown){
						mcTarget.gotoAndStop(2);
						setTxtFormat(2)
					} 
					break;
			}
			switch(e.type){
				case MouseEvent.MOUSE_OUT:
					//trace("out")
					mcTarget.gotoAndStop(1);
					setTxtFormat()
					isDown=false
					break;
			}
			switch(e.type){
				case MouseEvent.MOUSE_UP:
					//trace("up")
					mcTarget.gotoAndStop(2);
					setTxtFormat(2)
					isDown=false
			}
		}
		/**
		 * 设置按钮的显示的状态值，这里可以设置锁定状态， 如设置true,按钮此时，鼠标放上去点击这些状态无效 
		 * @param frame 状态值1,2,3,4
		 * @param isEnabled
		 * 
		 */		
		public function setStates(frame:Number,isLock:Boolean=true):void{
			if(frame!=1&&frame!=2&&frame!=3&&frame!=4) throw new Error("只能取1,2,3,4的值");
			if(isSetStatesWhenFrame1UnLock){
				if(frame==1){
					enabled=true;
				}else{
					enabled=!isLock;
				}
			}
			this.getTarget().gotoAndStop(frame);
		}
		/**
		 * 按钮点击后，是否解除锁定状态。
		 * @param isOk
		 * @return 
		 * 
		 */		
		public function setStatesWhenFrame1UnLock(isOk:Boolean):void{
			isSetStatesWhenFrame1UnLock=isOk;
		}
		
	}
}